# 基于pywebio库和pywebio库快速搭建的的远程SSH执行命令和脚本文件_WEB版_稳定版修订版V1.1_20211220
from pywebio.input import *
from pywebio.output import *
from pywebio import start_server
import fabric

def app():
    put_markdown('<h1>远程SSH执行命令</h1>')
    input_dic=input_group(                                                      #表单
        inputs=[
                input('服务器IP:',name='host',placeholder='请输入服务器IP'),     #输入框
                input('用户名:',name='user',placeholder='请输入用户名'),         #输入框
                input('密码:',name='password',placeholder='请输入密码',type=PASSWORD),                    #密码框
                textarea('需要执行的命令:',name='command',placeholder='请输入需要执行的命令',rows=6),       #多行文本框        
                file_upload("脚本文件上传:",name='file_upload',placeholder='请上传要执行的脚本文件')                      #文件上传框
                ])

    # 文件写入服务器            
    # with open(input_dic.get('file_upload').get('filename'),mode='wb') as f:
    #   f.write(input_dic.get('file_upload').get('content'))
    # put_text('文件上传成功!')

    print(type(input_dic))         #有文件上传框则为嵌套字典,没有则为常规的普通字典
    print(input_dic.keys())        #dict_keys(['user', 'password', 'select', 'checkbox', 'radio', 'textarea', 'file_upload'])
    # print(input_dic)

    #获取到必要参数
    host,user,password,command,file_content=None,None,None,None,None #初始化,防止后面的特判出现变量未申明使用的情况
    try:
        host=input_dic.get('host')
        user=input_dic.get('user')
        password=input_dic.get('password')
        command=input_dic.get('command')
        file_content=input_dic.get('file_upload').get('content')
    except:
        pass

    #上传的文件流默认是bytes类型,所以需要转成str再执行
    if file_content and type(file_content) == type(b''):
        file_content=file_content.decode()
        # print(file_content)

    # 开始执行命令
    if command:
        
        with fabric.Connection(host=host,user=user,connect_kwargs={'password': password}) as conn:
            try:
                result=conn.run(command=command,hide=True)
                result=result.stdout
                put_markdown('<h1>命令执行成功!</h1>')
                put_markdown('<h2>结果:</h2>')
                put_text(result)

            except Exception as e:
                put_markdown('<h1>命令执行失败!</h1>')
                put_markdown('<h2>结果:</h2>')
                put_text(e)


    # 开始执行脚本
    if file_content:
        try:
            command=f'nohup bash -c {file_content} >> .log 2>&1 &'
            result=conn.run(command=command,hide=True)
            result=result.stdout
            put_markdown('<h1>脚本文件执行成功!</h1>')

            #由于使用了nohup &机制,所以获取不到脚本实际执行状态,只能探测到时候开始执行
            # put_markdown('<h2>结果:</h2>')
            # put_text(result)

        except Exception as e:
            put_markdown('<h1>脚本文件执行失败!</h1>')

            #由于使用了nohup &机制,所以获取不到脚本实际执行状态,只能探测到时候开始执行
            # put_markdown('<h2>结果:</h2>')
            # put_text(e)

    put_markdown('<h1>程序结束!</h1>')



if __name__ == '__main__':
    start_server(
                applications=app,
                port=6868,
                host='0.0.0.0',
                cdn=False,
                # debug=True
                )

